///////////////////////////////////////////////////
/// tototoy Code
/// $Id: linklist.cc 35 2009-10-12 10:04:29Z tonyjobmails $
/// $Date: 2009-10-12 10:04:29 +0000 (Mon, 12 Oct 2009) $
/// $Author: tonyjobmails $
/// $Revision: 35 $
/// E-mail: tonyjobmails@gmail.com
/// filename: linklist.cc
/// function: 链表的一些特殊功能的实现
///////////////////////////////////////////////////

#include "bytetree.h"

namespace tototoy
{
	///////////////////////////////////////////////////
	/// @brief 特化类型_node_linklist<_character_type>版本的insert_by_order
	/// @param data：要插入的元素
	/// @param asc：true升序 false降序
	/// @return 成功与否
	template<>
	bool link_list<_node_linklist<_character_type>*>::insert_by_order(_node_linklist<_character_type>* const &data, bool asc)
	{
		_node_type *tmp = new _node_type;
		tmp->data = data;
		tmp->next_ptr = this->head;
		_node_type *pre = tmp;
		_node_type *node = this->head;

		while(node)
		{
			/// 找到位置
			if((asc && node->data->data.emotion > data->data.emotion)
					|| (asc && node->data->data.emotion < data->data.emotion))
				break;
			pre = node;
			node = node->next_ptr;
		}

		pre->next_ptr = tmp;
		tmp->next_ptr = node;
		if(node == this->head)
			this->head = tmp;
		this->length++;
		return true;
	}
	///////////////////////////////////////////////////

	///////////////////////////////////////////////////
	/// @brief 特化重载<<对linker的cout
	/// @param output：ostream对象
	/// @param op_data：操作对象
	std::ostream& operator << (std::ostream &output, link_list<_character_type> const &op_data)
	{
		std::string str;
		_uint_16 pos = 0;
		for(; pos < op_data.get_length(); ++pos)
		{
			_character_type tmp_char;
			if(op_data.get_pos_elem(pos + 1, tmp_char))
			{
				str[pos] = tmp_char.data;
			}
			else
			{
#ifdef _TONY_DEBUG
				std::cout << "重载<<的特化link_list中找不到第(" 
					<< pos << ")个元素, 链表长度(" << op_data.get_length() << ")" << std::endl;
#endif
				return output;
			}
		}
		str[pos] = 0;

		output << str.c_str();
		return output;
	}
	///////////////////////////////////////////////////
};
